package com.lb.ai.common.model;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 选择器数据模型，用于表示一组带有标签的选项数据
 * 
 * @param <T> 选项值的类型参数
 * @author LiuB
 **/
@Data
@NoArgsConstructor(staticName = "create")
public class Selector<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 选项列表，存储所有的选项数据
     */
    private final List<Option<T>> options = new ArrayList<>();

    /**
     * 添加单个选项
     *
     * @param label 选项标签，用于显示
     * @param value 选项值，实际存储的数据
     * @return {@link Selector}<T> 当前实例，支持链式调用
     */
    public Selector<T> addOption(String label, T value) {
        if (label == null) {
            return this;
        }
        this.options.add(Option.of(label, value));
        return this;
    }

    /**
     * 批量添加选项
     *
     * @param options 选项集合
     * @return {@link Selector}<T> 当前实例，支持链式调用
     */
    public Selector<T> addOptions(Collection<Option<T>> options) {
        if (options == null) {
            return this;
        }
        this.options.addAll(options);
        return this;
    }

    /**
     * 通过Map批量添加选项，其中Map的key作为选项标签，value作为选项值
     *
     * @param optionsMap 选项映射表，key为选项标签，value为选项值
     * @return {@link Selector}<T> 当前实例，支持链式调用
     */
    public Selector<T> addOptions(Map<String, T> optionsMap) {
        if (optionsMap == null) {
            return this;
        }
        optionsMap.forEach(this::addOption);
        return this;
    }

    /**
     * 选项数据模型，用于存储单个选项的标签和值
     *
     * @param <T> 选项值的类型参数
     */
    @Data
    @AllArgsConstructor(staticName = "of")
    @NoArgsConstructor(access = AccessLevel.PRIVATE)
    public static class Option<T> implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 选项标签，用于显示
         */
        private String label;

        /**
         * 选项值，实际存储的数据
         */
        private T value;
    }
}
